package com.youngcms.vo;

import java.io.Serializable;

public class LabelValue implements Serializable {
	private static final long serialVersionUID = 3689355407466181430L;
	/**
	 * The property which supplies the option label visible to the end user.
	 */
	private String label = null;

	/**
	 * The property which supplies the value returned to the server.
	 */
	private String value = null;

	/**
	 * Default constructor.
	 */
	public LabelValue() {
		super();
	}

	/**
	 * Construct an instance with the supplied property values.
	 * 
	 * @param label
	 *            The label to be displayed to the user.
	 * @param value
	 *            The value to be returned to the server.
	 */
	public LabelValue(String label, String value) {
		this.label = label;
		this.value = value;
	}

	// ------------------------------------------------------------- Properties

	public String getLabel() {
		return this.label;
	}

	public void setLabel(String label) {
		this.label = label;
	}

	public String getValue() {
		return this.value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	// --------------------------------------------------------- Public Methods

	/**
	 * Compare LabelValueBeans based on the label, because that's the human
	 * viewable part of the object.
	 * 
	 * @see Comparable
	 */
	public int compareTo(Object o) {
		// Implicitly tests for the correct type, throwing
		// ClassCastException as required by interface
		String otherLabel = ((LabelValue) o).getLabel();

		return this.getLabel().compareTo(otherLabel);
	}

	/**
	 * Return a string representation of this object.
	 */
	public String toString() {
		StringBuffer sb = new StringBuffer("LabelValue[");
		sb.append(this.label);
		sb.append(", ");
		sb.append(this.value);
		sb.append("]");
		return (sb.toString());
	}

	/**
	 * LabelValueBeans are equal if their values are both null or equal.
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	public boolean equals(Object obj) {
		if (obj == this) {
			return true;
		}

		if (!(obj instanceof LabelValue)) {
			return false;
		}

		LabelValue bean = (LabelValue) obj;
		int nil = (this.getValue() == null) ? 1 : 0;
		nil += (bean.getValue() == null) ? 1 : 0;

		if (nil == 2) {
			return true;
		} else if (nil == 1) {
			return false;
		} else {
			return this.getValue().equals(bean.getValue());
		}

	}

	/**
	 * The hash code is based on the object's value.
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	public int hashCode() {
		return (this.getValue() == null) ? 17 : this.getValue().hashCode();
	}
}
